home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
133_01
/
e6
< prev
next >
Wrap
Text File
|
1985-03-09
|
6KB
|
309 lines
/*
e screen editor
(C) G. Nigel Gilbert, MICROLOGY, 1981
August-December 1981
FILE: e6
FUNCTIONS: blockpos,blockops,putpart,listfile
PURPOSE: performs block commands
*/
#include "e.h"
blockpos(oldpos)
int oldpos;
{
char c, getkey();
int to;
if (oldpos) puts("| or |P|rev.");
do {
putlineno(cline);
resetcursor();
switch ((c=getkey())) {
case DOWNKEY :
moveline(1);
break;
case UPKEY :
moveline(-1);
break;
case LEFTKEY :
movechar(-1);
break;
case RIGHTKEY :
movechar(1);
break;
case LEFTWKEY :
moveword(-1);
break;
case RIGHTWKEY :
moveword(1);
break;
case BOLKEY :
sync(0);
break;
case EOLKEY :
sync(strlen(text));
break;
case UPPAGE :
movepage(-1);
break;
case DOWNPAGE :
movepage(0);
break;
case HOMEKEY :
if (jumpline(lastl-cline)) sync(strlen(text));
break;
case BOFKEY :
if (jumpline(1-cline)) sync(0);
break;
case JUMPKEY :
putmess("Jump to? ");
scans(ans,6);
if ((to=atoi(ans)))
jumpline(to-cline);
break;
case FINDKEY :
replace=NO;
findorrep();
break;
case REPKEY :
repeat=YES;
dofindrep(1);
repeat=NO;
break;
case 'p' :
case 'P' :
if (oldpos) return PREV;
break;
case ESCKEY :
return FAIL;
default :
;
}
}
while (c != CR);
return cline;
}
blockops()
{
int oldcline, oldcharn, oldto, oldfrom, op;
int l, ll, line, *t, shifts, shiftx, cp, y;
char *txt, c, shift[LLIM], *getline(), getlow(), getkey();
puttext();
oldcline=cline;
oldcharn=charn;
oldfrom=from;
oldto=to;
putmess("W|rite to file, |P|rint, |S|hift, |M|ove, |C|opy, or |D|elete block ? ");
while (YES) {
switch ((op=getlow())) {
case ESCKEY :
return;
case 'w':
puts("Write");
break;
case 'p':
puts("Print");
break;
case 's':
puts("Shift");
break;
case 'm':
puts("Move");
break;
case 'c':
puts("Copy");
break;
case 'd':
puts("Delete");
break;
default:
continue;
}
break;
}
from=cline;
to=0;
blocking=YES;
putmess("|Put cursor on line |end|ing block and press [return]");
if ( (to=blockpos(oldto)) == FAIL) {
to=cline;
goto abort;
}
if (to == PREV) {
moveline(oldfrom-cline);
to=loc(oldto,0);;
for (l=from=cline, y=cursory, ll= (oldto < plast ? oldto : plast);
l <= ll; l++, y++) putline(l,y);
}
if (to < from) {
l=to;
to=from;
from=l;
}
switch (op) {
case 'w':
putmess("File to write to? ");
if (scans(name,15) != ESCKEY)
if (exists(name)) writefile(from,to,name,name,NO);
break;
case 'p':
listfile(from,to);
break;
case 's':
putmess("Delete/insert spaces/tabs| to shift line, and press [return]");
moveline(from-cline);
sync(0);
resetcursor();
for (shifts=0; (c=getkey()) != CR; ) {
switch (c) {
case DELRIGHT:
if (text[0] == ' ' || text[0] == '\t')
deletechar(0);
break;
case ' ':
insertchar(' ');
break;
case TAB:
insertchar('\t');
break;
case ESCKEY:
goto abort;
default:
continue; /*ignore other characters*/
}
shift[shifts++]=c;
sync(0);
resetcursor();
}
puttext();
for (l=from+1; l <= to; l++) {
gettext(l);
for (shiftx=0; shiftx < shifts; shiftx++) {
switch((c=shift[shiftx])) {
case DELRIGHT:
if (*(txt=&text[0]) == ' ' || *txt == '\t')
while ( (*txt=*(txt+1))) txt++;
break;
case ' ':
case TAB:
if ((cp=strlen(text)) < (LLIM-1)) {
for (; cp >= 0; cp--)
text[cp+1]=text[cp];
text[0]= (c == ' ' ? ' ':'\t');
}
break;
}
}
altered=YES;
puttext();
}
break;
case 'd':
for (l=from; l <= to; l++) delete(from);
gettext(loc(from,0));
adjustc(cursorx);
from=to=0;
break;
case 'm':
case 'c':
putmess("|Put cursor on |line under which block is to go |and press [return]");
if ( (cline=line=blockpos(0)) == FAIL) {
cline=oldcline;
break;
}
for (l=from; l <= to; l++) {
if ((line=inject(line,getline(l))) == FAIL) break;
if (op == 'm') {
delete( (l<line?l:l+1) );
if (to < line) {
to--;
l--;
line--;
cline--;
}
}
else {
if (to >= line) to++;
if (l >= line) l++;
if (l == cline) l=line;
}
}
from=cline+1;
to=line;
break;
}
abort:
blocking=NO;
switch (op) {
case 'w':
case 'p':
case 's':
cline=oldcline;
charn=oldcharn;
putpart(from,to);
break;
case 'd':
putpart(cline,cline+SHEIGHT);
break;
case 'm':
case 'c':
putpage();
break;
}
}
putpart(start,fin)
int start,fin;
{
int l, y;
if (start < pfirst) putpage();
else
for (l=start, y=topline+(start-pfirst); l <= fin && y <= SHEIGHT;
l++, y++) {
if (l == cline) cursory=y;
putline(l,y);
}
gettext(cline);
}
listfile(from,to)
int from,to;
{
int l,cp,i;
char *t;
puttext();
for (l=from; l<=to; l++) {
if (l%10 == 0) putlineno(l);
for (cp=0, t=getline(l); *t; t++)
if (*t == '\t') for (i=tabwidth-cp%tabwidth; i>0 ; cp++, i--)
bdos(LSTOUT,' ');
else {
if (*t > CTRL) bdos(LSTOUT,*t);
else {
bdos(LSTOUT,'^');
bdos(LSTOUT,*t+64);
}
cp++;
}
bdos(LSTOUT,'\r');
bdos(LSTOUT,'\n');
if (testkey() == ESCKEY) {
error("Listing aborted");
return;
}
}
}
'\t')
while ( (*txt=*(txt+1))) txt++;
break;